package com.lzy.wzy.mapper;

import com.lzy.wzy.model.*;
import com.lzy.wzy.sel.PtInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;

@Mapper
public interface TemplateMapper {
    //查询模板
    List<TemplateBean> queryTemplateProcess(int id);

    //查询模板所有列
    LinkedList<String> getTemplateAllFields(int id);


    //通过模板id查询tableName
    String queryTableNameByTemplateId(int templateId);

    //查询表是否存在
    Integer existTable(String tableName);

    //创建表
    Integer createTable(@Param(value = "myMap") Map<String, String> map);


    void createIndex(@Param("tableName") String tableName);

    void createIdIndex(@Param("tableName") String tableName);


    //    批量插入模板表格数据
    Integer batchInsert(@Param("tableName") String tableName, @Param("fieldNames") List<String> fieldNames, List<LinkedHashMap<String, Object>> list);


    //通过模板唯一标识nick_name and 工单号 查询 body数据
    List<LinkedHashMap<String, Object>> queryTemplateBodyData(@Param("tableName") String tableName, @Param("fieldNames") List<String> fieldNames, @Param("workOrderNumber") String workOrderNumber);


    // 通过流工单编号查询 此工单下的模板
    List<LevelOneTemplateBean> getWorkOrderTemplate(String workOrderNumber);

    List<LevelOneTemplateBean> getWorkOrderEnabledTemplate(String workOrderNumber);

    LevelOneTemplateBean getAReworkOrderTemplate(String workOrderNumber);

    LevelOneTemplateBean getAReworkOrderEnabledTemplate(String workOrderNumber);

    //获取所有已通过的一级模板
    List<LevelOneTemplateBean> getAllFirstLevelTemplatesPassed(String status);

    //获取所有已通过的一级模板id
    List<Integer> getLevelOneTemplateIdPassed();

    //获取所有一级模板
    List<LevelOneTemplateBean> getAllFirstLevelTemplates();

    //获取所有一级模板信息
    List<FirstLevelTemplateInformationBean> getAllFirstLevelTemplateInformation();

    // 检查编码是否绑定模板
    Integer getWorkOrderTemplateByProductCode(@Param("productCode") String productCode, @Param("templateId") int templateId);

    //绑定模板
    Integer bindingTemplate(@Param("productCode") String productCode, @Param("templateId") int templateId);


    //预览模板 只查name
    List<TemplateNameBean> queryTemplateName(int id);

    //    获取所有三级模板
    List<LevelOneTemplateBean> getAllLeaveThreeTemplate();

    //    获取所有二级模板
    List<LevelOneTemplateBean> getAllLeaveTwoTemplate();

    //    通过模板名称获取三级模板
    Integer getLeaveThreeTemplateByTemplateName(String templateName);

    // 通过字段获取三级模板
    Integer getLevelThreeTemplateByFieldName(String fieldName);

    //    添加三级模板
    Integer addLeaveThreeTemplate(@Param("templateName") String templateName, @Param("fieldName") String fieldName);

    //    通过templateName获取二级模板
    Integer getLeaveTwoTemplateByTemplateName(String templateName);

    //<!--    检验提交的二级模板个数-->
    Integer getLevelTwoTemplateByIds(List<Integer> list);

    List<String> getLevelTwoTemplateChildTemplate(List<Integer> list);

    //检验提交的三级模板个数
    Integer getLevelThreeTemplateByIds(List<BingDingTemplate> list);

    //    添加二级模板
    Integer addLeaveTwoTemplate(@Param("templateName") String templateName);

    //二级三级模板绑定
    Integer bingDingTwoTemplate(List<BingDingTemplate> list);

    //    通过templateName获取一级模板
    Integer getLeaveOneTemplateByTemplateName(@Param("templateName") String templateName, @Param("aliasName") String aliasName);

    //添加一级模板
    Integer addLeaveOneTemplate(@Param("templateName") String templateName, @Param("templateAlias") String templateAlias, @Param("templateStatus") String templateStatus, @Param("author") String author, @Param("createDate") LocalDate createDate);

    //一二级模板绑定
    Integer bingDingOneTwoLeaveTemplate(List<BingDingTemplate> list);

    //清空表数据
    Integer emptyRecord(@Param("tableName") String tableName, @Param("workOrderNumber") String workOrderNumber);


    //上报异常信息
    Integer saveExceptionInfo(ExceptionReportBean exceptionReportBean);


    //获取此工单下 操作记录
    List<ModifyRecordBean> getWorkOrderTestDataModificationRecord(@Param("workOrderNumber") String workOrderNumber, @Param("type") int type, @Param("templateId") int templateId);


    //获取工单模板操作状态
    Map<String, Object> getTicketTemplateOperatingStatus(@Param("workOrderNumber") String workOrderNumber);

    //获取返修工单是否绑定模板
    Integer getReworkOrderTemplateByNumber(String workOrderNumber);

    //返修工单绑定模板
    Integer saveReworkTemplateInfo(@Param("workOrderNumber") String workOrderNumber, @Param("templateId") int templateId);


    //更新编码与模板绑定信息
    Integer updateProductCodeAndTemplateBindingInformation(@Param("productCode") String productCode, @Param("newTemplateId") int newTemplateId, @Param("oldTemplateId") int oldTemplateId);

    //删除产品编码和模板映射
    Integer deleteCodeTemplateMapping(@Param("productCode") String productCode, @Param("templateId") int templateId);

    //    获取所有已绑定模板的产品编码
    List<String> getAllProductCode();

    //通过产品编码获取对应的模板
    List<LevelOneTemplateBean> getLevelOneTemplateByProductCode(String productCode);

    //获取三级模板名称和列名
    List<LinkedHashMap<String, String>> getThreeLeaveTemplateIdAndNameByOneId(int templateId);


    Integer deleteThisLevelOneTemplate(int templateId);

    //删除此模板映射
    Integer deleteThisLevelOneTemplateMapping(int templateId);

    //删除绑定编码对应映射
    Integer deleteThisLevelOneTemplateCodeMapping(int templateId);

    //获取模板对应的产品编码
    List<String> getProductCodeByTemplateId(int templateId);

    //删除表
    Integer deleteTable(@Param("tableName") String tableName);


    //删除该模板对应的操作记录
    void deleteTheTemplateModifyRecord(int templateId);

    //通过模板id获取返修工单个数
    Integer getReworkOrderByTemplateId(int templateId);

    //删除返修工单映射
    void deleteReworkOrderMapping(int templateId);

    //获取一级模板状态
    String getFirstLevelTemplateStatus(@Param("templateId") int templateId);

    PreviewBean getFirstLevelTemplateStatusAndIdf(@Param("templateId") int templateId);

    //更新一级模板状态
    Integer updateFirstLevelTemplateStatus(@Param("templateStatus") String templateStatus, @Param("templateId") int templateId);

    //获取二级模板对应的子模板
    List<ChildTemplateNameBean> getChildTemplateInformationByLevelTwoId(int templateId);

    //删除三级模板
    Integer deleteLevelThreeTemplate(int templateId);

    //删除二级模板
    Integer deleteLevelTwoTemplate(int templateId);

    //删除二级模板映射
    Integer deleteLevelTwoTemplateMapping(int templateId);

    //获取三级模板映射个数
    Integer getLevelThreeMappingCount(int templateId);

    //获取二级模板映射个数
    Integer getLevelTwoMappingCount(int templateId);

    //获取未被使用的三级模板
    List<LevelOneTemplateBean> getUnusedThreeLevelTemplates();

    //获取未被使用的二级模板
    List<LevelOneTemplateBean> getUnusedTwoLevelTemplates();

    //通过id获取二级模板名称
    String getLevelTwoTemplateNameById(int templateId);

    //通过id获取三级模板名称
    String getLevelThreeTemplateNameById(int templateId);

    String getLevelOneTemplateNameById(int templateId);

    //保存公告信息
    void saveAnnouncementInformation(BulletinBean bulletinBean);


    //
    List<ModifyRecordBean> getThisMonthTestDataModificationRecord(@Param("year") Integer year, @Param("month") Integer month, @Param("workOrderNumber") String workOrderNumber, @Param("type") int type, @Param("templateId") int templateId);


    // List<ModifyRecordBean> getOtherMonthTestDataModificationRecord(@Param("time") String time,@Param("workOrderNumber") String workOrderNumber, @Param("type") int type, @Param("templateId") int templateId);

    List<ModifyRecordBean> getProduceRecordByYear(@Param("year") Integer year, @Param("workOrderNumber") String workOrderNumber, @Param("type") int type, @Param("templateId") int templateId);

    List<ModifyRecordBean> getProduceRecordByMonth(@Param("year") Integer year, @Param("month") Integer month, @Param("workOrderNumber") String workOrderNumber, @Param("type") int type, @Param("templateId") int templateId);


    List<ModifyRecordBean> getProductionRecordsOfOtherYears(@Param("year") Integer year, @Param("workOrderNumber") String workOrderNumber, @Param("type") int type, @Param("templateId") int templateId);

    List<ModifyRecordBean> getProductionRecordsOfOtherMonths(@Param("time") String time, @Param("workOrderNumber") String workOrderNumber, @Param("type") int type, @Param("templateId") int templateId);

    List<ModifyRecordBean> getTodayProductionData(@Param("time") String time, @Param("workOrderNumber") String workOrderNumber, @Param("type") int type, @Param("templateId") int templateId);

    List<ModifyRecordBean> getProductionDataBeforeToday(@Param("time") String time, @Param("workOrderNumber") String workOrderNumber, @Param("type") int type, @Param("templateId") int templateId);

    //获取第一个产品编码
    String getFirstProductCode();

    //获取产品编码绑定数据
    List<PtInfo> getProductTemplateDataByCode(String productCode);

    List<PtInfo> getPtInfoByCodeAndYear(@Param("productCode") String productCode, @Param("time") String time);

    List<PtInfo> getPtInfoByCodeAndMonth(@Param("productCode") String productCode,@Param("time") String time);

    List<PtInfo> getPtInfoByCodeAndTime(@Param("productCode") String productCode,@Param("time") String time);

    //通过返修工单获取模板id
    Integer getTemplateIdByRework(String workOrderNumber);

    //查询机器数量
    Integer getMachinesCountByWorkOrderNumber(@Param("tableName") String tableName, @Param("workOrderNumber") String workOrderNumber);


    void saveLastTime(@Param("lastTime") LocalDateTime lastTime, @Param("serialNumber") String serialNumber);

    void updateOperationInfo(ProductionBean productionBean);

    void saveProductionRecord(ProductionBean productionBean);

    void updateOperationStatus(@Param("status") int status, @Param("serialNumber") String serialNumber);

    ProductionBean queryProductionOperation(String serialNumber);

    List<ProductionBean> getAllProductionInfo();

    Integer existProductionInfo(String serialNumber);

    Integer getProductionStatus(String serialNumber);

    void updateProductData(@Param("tableName") String tableName, @Param("id") String id, @Param("val") String val, @Param("field") String field);

    void saveProductData(@Param("tableName") String tableName, @Param("list") List<String> list);

    LinkedHashMap<String,String> getProductDatById(@Param("tableName") String tableName, @Param("id") String id);

    String getSingleData(@Param("tableName") String tableName,@Param("field") String field,@Param("id") String id);

    void delProductData(@Param("tableName") String tableName, @Param("id") String id);


    void saveReportData(@Param("map")Map<String, Map<String, Map<String, Integer>>> map,@Param("statTime")String statTime,@Param("statType") int statType);

    Integer checkForPresenceReportData(@Param("productCode") String productCode,@Param("workOrderNumber") String workOrderNumber,@Param("statTime") String statTime);

    void deleteReportData(@Param("list") List<Integer> list,@Param("time") String time);

    //更新返修工单模板
    Integer updateReworkOrderTemplate(@Param("workOrderNumber")String workOrderNumber,@Param("newTemplateId")int newTemplateId,@Param("oldTemplateId") int oldTemplateId);

    //通过产品编码查询返修工单模板id
    List<PcodeTempBean> queryReworkTemplateIdByCode(String productCode);

    //获取模板id和名称
    LevelOneTemplateBean getTemplateNameByRework(String workOrderNumber);

    String getTableNameByNumber(@Param("workOrderNumber")String workOrderNumber,@Param("templateId")Integer templateId);

    //更新模板标识符
    Integer updateTemplateIdf(@Param("newIdf")int newIdf,@Param("templateId")int templateId,@Param("oldIdf")int oldIdf);

    //获取模板标识符
    Integer queryTemplateIdf(int templateId);
}
